package io.alvin.ch02;

/**
 * 线程中断
 * 欠妥的做法：直接使用stop方法停止线程。
 *
 * 与线程中断相关的三个方法：
 * 1) public void Thread.interrupt()    // 中断线程
 * 2) public boolean Thread.isInterrupted()         // 判断是否被中断
 * 3) public static boolean Thread.interrupted()    // 判断是否被中断，请清除当前中断状态
 * Created by Alvin on 2017/7/6.
 */
public class ThreadInterruptDemo {

    public static void main(String[] args) throws InterruptedException {
        Thread t1 = new Thread() {
            @Override
            public void run() {
                while(true) {
                    /**
                     * 中断处理，退出循环体，结束线程
                     * 利用线程中断标志与stopme标记非常类似，但是中断功能更为强大，例如：在循环体中出现了wait或者sleep操作，只有通过中断识别。
                     */
                    if(Thread.currentThread().isInterrupted()) {
                        System.out.println("Interrupted");
                        break;
                    }

                    try {
                        Thread.sleep(2000);

                    } catch (InterruptedException e) {
                        System.out.println("Interrupted When Sleep");
                        // do sth. 完成后续的处理，保证数据的一致性和完整性，最后再中断自己，设置中断标记位，交由While循环体开始处处理。

                        //设置中断状态
                        Thread.currentThread().interrupt();
                    }

                    Thread.yield();
                }
            }
        };
        t1.start();
        Thread.sleep(1000);
        t1.interrupt();
    }
}
